查看原文
其他

使用cJSON库解析JSON

王超 电子电路开发学习 2021-01-31

cJSON库的下载

cJSON是一个基于C的JSON解析库,这个库非常简单,只有cJSON.c和cJSON.h两个文件,支持JSON的解析和封装,需要调用时,只需要 #include"cJSON.h"就可以使用了。

只包含键值对的JSON字符串解析

JSON字符串:

  1. {

  2.    "name": "Andy",      //键值对1

  3.    "age": 20              //键值对2

  4. }

这个JSON对象只有两个键值对,键name对应字符串Andy,键age对应数字20。

  1. void Parse_Str1(void)

  2. {

  3.    char str1[] = "{\"name\":\"Andy\",\"age\":20}";

  4.    cJSON *str1_json, *str1_name, *str1_age;

  5.    printf("str1:%s\n\n",str1);

  6.    str1_json = cJSON_Parse(str1);   //创建JSON解析对象,返回JSON格式是否正确

  7.    if (!str1_json)

  8.    {

  9.        printf("JSON格式错误:%s\n\n", cJSON_GetErrorPtr()); //输出json格式错误信息

  10.    }

  11.    else

  12.    {

  13.        printf("JSON格式正确:\n%s\n\n",cJSON_Print(str1_json) );

  14.        str1_name = cJSON_GetObjectItem(str1_json, "name"); //获取name键对应的值的信息

  15.        if (str1_name->type == cJSON_String)

  16.        {

  17.            printf("姓名:%s\r\n", str1_name->valuestring);

  18.        }

  19.        str1_age = cJSON_GetObjectItem(str1_json, "age");   //获取age键对应的值的信息

  20.        if(str1_age->type==cJSON_Number)

  21.        {

  22.            printf("年龄:%d\r\n", str1_age->valueint);

  23.        }

  24.        cJSON_Delete(str1_json);//释放内存

  25.    }

  26. }

运行结果:


含数组的JSON字符串解析

JSON字符串:

  1. {

  2.    "location": [{

  3.            "name": "Faye",

  4.            "address": "北京"

  5.        },

  6.        {

  7.            "name": "Andy",

  8.            "address": "香港"

  9.        }

  10.    ],

  11.    "time": "2018-11-17"

  12. }

解析函数:

  1. void Parse_Str2(void)

  2. {


  3.    char str2[] = "{\"location\":[{\"name\":\"Faye\",\"address\":\"北京\"},{\"name\":\"Andy\",\"address\":\"香港\"}],\"time\":\"2018-11-17\"}";


  4.    cJSON *root = 0;

  5.    cJSON *loc_json = 0;

  6.    cJSON *name1_json,*name2_json;

  7.    char *time_str, *str_tmp;


  8.    root = cJSON_Parse(str2);

  9.    if(!root)

  10.        printf("str2 JSON格式错误:%s \r\n", cJSON_GetErrorPtr());

  11.    else

  12.    {

  13.        printf("str2 JSON格式正确:\n%s\n",cJSON_Print(root));

  14.        time_str = cJSON_GetObjectItem(root,"time")->valuestring;//time键值对

  15.        printf("time:%s\n", time_str);


  16.        loc_json = cJSON_GetObjectItem(root,"location");

  17.        if(loc_json)

  18.        {

  19.            name1_json = cJSON_GetArrayItem(loc_json,0);        //数组第0个元素

  20.            str_tmp = cJSON_GetObjectItem(name1_json, "name")->valuestring;//name键对应的值

  21.            printf("name1 is : %s \r\n", str_tmp);

  22.            str_tmp = cJSON_GetObjectItem(name1_json, "address")->valuestring;//addr1键对应的值

  23.            printf("addr1 is : %s \r\n", str_tmp);


  24.            name2_json = cJSON_GetArrayItem(loc_json,1);       //数组第1个元素

  25.            str_tmp = cJSON_GetObjectItem(name2_json, "name")->valuestring;

  26.            printf("name2 is : %s \r\n", str_tmp);

  27.            str_tmp = cJSON_GetObjectItem(name2_json, "address")->valuestring;

  28.            printf("addr2 is : %s \r\n", str_tmp);

  29.        }

  30.    }

  31.    cJSON_Delete(loc_json);

  32. }

运行结果:


北京时间JSON数据解析

api地址:

http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json

JSON字符串:

  1. {

  2.    "success": "1",

  3.    "result": {

  4.        "timestamp": "1543922613",

  5.        "datetime_1": "2018-12-04 19:23:33",

  6.        "datetime_2": "2018年12月04日 19时23分33秒",

  7.        "week_1": "2",

  8.        "week_2": "星期二",

  9.        "week_3": "周二",

  10.        "week_4": "Tuesday"

  11.    }

  12. }                              

解析函数:

  1. void Parse_BJ_Time(void)

  2. {

  3.    char bj_time_str[] = "{\"success\":\"1\",\"result\":{\"timestamp\":\"1542456793\",\"datetime_1\":\"2018-11-17 20:13:13\",\"datetime_2\":\"2018年11月17日 20时13分13秒\",\"week_1\":\"6\",\"week_2\":\"星期六\",\"week_3\":\"周六\",\"week_4\":\"Saturday\"}}";


  4.    cJSON *root;

  5.    cJSON *result_json;

  6.    char *datetime, *week;


  7.    root = cJSON_Parse(bj_time_str);

  8.    if(root)

  9.    {

  10.        printf("json格式正确:\n%s\n\n", cJSON_Print(root));

  11.        result_json =  cJSON_GetObjectItem(root, "result");  //获取result键对应的值

  12.        if(result_json)

  13.        {

  14.            datetime = cJSON_GetObjectItem(result_json, "datetime_2")->valuestring;

  15.            printf("北京时间: %s \r\n", datetime);

  16.            week = cJSON_GetObjectItem(result_json, "week_2")->valuestring;

  17.            printf("星期: %s \r\n", week);

  18.        }

  19.    }

  20.    cJSON_Delete(root);

  21.    cJSON_Delete(result_json);

  22. }

运行结果:


心知天气JSON数据解析

JSON字符串:

  1. {

  2.    "results": [{

  3.        "location": {

  4.            "id": "WS10730EM8EV",

  5.            "name": "深圳",

  6.            "country": "CN",

  7.            "path": "深圳,深圳,广东,中国",

  8.            "timezone": "Asia/Shanghai",

  9.            "timezone_offset": "+08:00"

  10.        },

  11.        "daily": [{

  12.            "date": "2018-11-18",

  13.            "text_day": "多云",

  14.            "code_day": "4",

  15.            "text_night": "多云",

  16.            "code_night": "4",

  17.            "high": "26",

  18.            "low": "20",

  19.            "precip": "",

  20.            "wind_direction": "无持续风向",

  21.            "wind_direction_degree": "",

  22.            "wind_speed": "10",

  23.            "wind_scale": "2"

  24.        }, {

  25.            "date": "2018-11-19",

  26.            "text_day": "小雨",

  27.            "code_day": "13",

  28.            "text_night": "小雨",

  29.            "code_night": "13",

  30.            "high": "25",

  31.            "low": "20",

  32.            "precip": "",

  33.            "wind_direction": "无持续风向",

  34.            "wind_direction_degree": "",

  35.            "wind_speed": "10",

  36.            "wind_scale": "2"

  37.        }, {

  38.            "date": "2018-11-20",

  39.            "text_day": "小雨",

  40.            "code_day": "13",

  41.            "text_night": "小雨",

  42.            "code_night": "13",

  43.            "high": "25",

  44.            "low": "21",

  45.            "precip": "",

  46.            "wind_direction": "无持续风向",

  47.            "wind_direction_degree": "",

  48.            "wind_speed": "10",

  49.            "wind_scale": "2"

  50.        }],

  51.        "last_update": "2018-11-18T11:00:00+08:00"

  52.    }]

  53. }

解析函数:

  1. void parse_seniverse_weather(void)

  2. {

  3.    char weather_str[] =

  4.        "{\"results\":[{\"location\":{\"id\":\"WS10730EM8EV\",\"name\":\"深圳\",\"country\":\"CN\",\"path\":\"深圳,深圳,广东,中国\",\"timezone\":\"Asia/Shanghai\",\"timezone_offset\":\"+08:00\"},\"daily\":[{\"date\":\"2018-11-18\",\"text_day\":\"多云\",\"code_day\":\"4\",\"text_night\":\"多云\",\"code_night\":\"4\",\"high\":\"26\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-19\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"20\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"},{\"date\":\"2018-11-20\",\"text_day\":\"小雨\",\"code_day\":\"13\",\"text_night\":\"小雨\",\"code_night\":\"13\",\"high\":\"25\",\"low\":\"21\",\"precip\":\"\",\"wind_direction\":\"无持续风向\",\"wind_direction_degree\":\"\",\"wind_speed\":\"10\",\"wind_scale\":\"2\"}],\"last_update\":\"2018-11-18T11:00:00+08:00\"}]}";

  5.    cJSON *root;

  6.    cJSON *results;

  7.    cJSON *last_update;

  8.    cJSON *loc_json, *daily_json;

  9.    cJSON *forecast_json;

  10.    char *loc_tmp, *weather_tmp, *update_tmp;

  11.    int i = 0;


  12.    root = cJSON_Parse((const char*)weather_str);

  13.    if(root)

  14.    {

  15. //        printf("JSON格式正确:\n%s\n\n",cJSON_Print(root));    //输出json字符串

  16.        results = cJSON_GetObjectItem(root, "results");

  17.        results = cJSON_GetArrayItem(results,0);

  18.        if(results)

  19.        {

  20.            loc_json = cJSON_GetObjectItem(results, "location");   //得到location键对应的值,是一个对象


  21.            loc_tmp = cJSON_GetObjectItem(loc_json, "id") -> valuestring;

  22.            printf("城市ID:%s\n",loc_tmp);

  23.            loc_tmp = cJSON_GetObjectItem(loc_json, "name") -> valuestring;

  24.            printf("城市名称:%s\n",loc_tmp);

  25.            loc_tmp = cJSON_GetObjectItem(loc_json, "timezone") -> valuestring;

  26.            printf("城市时区:%s\n\n",loc_tmp);


  27.            daily_json = cJSON_GetObjectItem(results, "daily");

  28.            if(daily_json)

  29.            {

  30.                for(i = 0; i < 3; i++)

  31.                {

  32.                    forecast_json = cJSON_GetArrayItem(daily_json, i);

  33.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;

  34.                    printf("日期:%s\r\n", weather_tmp);

  35.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_day") -> valuestring;

  36.                    printf("白天天气代码:%s\r\n", weather_tmp);

  37.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "code_night") -> valuestring;

  38.                    printf("晚上天气代码:%s\r\n", weather_tmp);

  39.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "high") -> valuestring;

  40.                    printf("最高温度:%s\r\n", weather_tmp);

  41.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "low") -> valuestring;

  42.                    printf("最低温度:%s\r\n", weather_tmp);

  43.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_direction_degree") -> valuestring;

  44.                    printf("风向角度:%s\r\n", weather_tmp);

  45.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_scale") -> valuestring;

  46.                    printf("风力:%s\r\n\n", weather_tmp);

  47.                }

  48.            }

  49.            else

  50.                printf("daily json格式错误\r\n");

  51.            last_update = cJSON_GetObjectItem(results, "last_update");

  52.            update_tmp = last_update->valuestring;

  53.            if(last_update)

  54.            {

  55.                printf("更新时间:%s\r\n", update_tmp);

  56.            }

  57.        }

  58.        else

  59.        {

  60.            printf("results格式错误:%s\r\n", cJSON_GetErrorPtr());

  61.        }

  62.    }

  63.    else

  64.    {

  65.        printf("JSON格式错误\r\n");

  66.    }

  67.    cJSON_Delete(root);

  68.    cJSON_Delete(results);

  69. }

运行结果:

和风天气数据解析

JSON字符串:

  1. {

  2.    "HeWeather6": [{

  3.        "basic": {

  4.            "cid": "CN101010700",

  5.            "location": "昌平",

  6.            "parent_city": "北京",

  7.            "admin_area": "北京",

  8.            "cnty": "中国",

  9.            "lat": "40.21808624",

  10.            "lon": "116.23590851",

  11.            "tz": "+8.00"

  12.        },

  13.        "update": {

  14.            "loc": "2018-11-21 21:45",

  15.            "utc": "2018-11-21 13:45"

  16.        },

  17.        "status": "ok",

  18.        "daily_forecast": [{

  19.            "cond_code_d": "100",

  20.            "cond_code_n": "100",

  21.            "cond_txt_d": "晴",

  22.            "cond_txt_n": "晴",

  23.            "date": "2018-11-21",

  24.            "hum": "21",

  25.            "mr": "16:02",

  26.            "ms": "04:27",

  27.            "pcpn": "0.0",

  28.            "pop": "0",

  29.            "pres": "1030",

  30.            "sr": "07:08",

  31.            "ss": "16:53",

  32.            "tmp_max": "9",

  33.            "tmp_min": "-3",

  34.            "uv_index": "5",

  35.            "vis": "10",

  36.            "wind_deg": "323",

  37.            "wind_dir": "西北风",

  38.            "wind_sc": "1-2",

  39.            "wind_spd": "4"

  40.        }, {

  41.            "cond_code_d": "100",

  42.            "cond_code_n": "101",

  43.            "cond_txt_d": "晴",

  44.            "cond_txt_n": "多云",

  45.            "date": "2018-11-22",

  46.            "hum": "21",

  47.            "mr": "16:36",

  48.            "ms": "05:33",

  49.            "pcpn": "0.0",

  50.            "pop": "0",

  51.            "pres": "1030",

  52.            "sr": "07:09",

  53.            "ss": "16:52",

  54.            "tmp_max": "8",

  55.            "tmp_min": "-4",

  56.            "uv_index": "3",

  57.            "vis": "20",

  58.            "wind_deg": "35",

  59.            "wind_dir": "东北风",

  60.            "wind_sc": "1-2",

  61.            "wind_spd": "5"

  62.        }, {

  63.            "cond_code_d": "101",

  64.            "cond_code_n": "100",

  65.            "cond_txt_d": "多云",

  66.            "cond_txt_n": "晴",

  67.            "date": "2018-11-23",

  68.            "hum": "23",

  69.            "mr": "17:15",

  70.            "ms": "06:41",

  71.            "pcpn": "0.0",

  72.            "pop": "16",

  73.            "pres": "1024",

  74.            "sr": "07:10",

  75.            "ss": "16:52",

  76.            "tmp_max": "7",

  77.            "tmp_min": "-2",

  78.            "uv_index": "2",

  79.            "vis": "20",

  80.            "wind_deg": "305",

  81.            "wind_dir": "西北风",

  82.            "wind_sc": "1-2",

  83.            "wind_spd": "3"

  84.        }]

  85.    }]

  86. }

解析函数:

  1. //解析和风天气,格式和心知天气非常像

  2. void parse_heweather(void)

  3. {

  4.    char heweather_str[] = "{\"HeWeather6\":[{\"basic\":{\"cid\":\"CN101010700\",\"location\":\"昌平\",\"parent_city\":\"北京\",\"admin_area\":\"北京\",\"cnty\":\"中国\",\"lat\":\"40.21808624\",\"lon\":\"116.23590851\",\"tz\":\"+8.00\"},\"update\":{\"loc\":\"2018-11-21 21:45\",\"utc\":\"2018-11-21 13:45\"},\"status\":\"ok\",\"daily_forecast\":[{\"cond_code_d\":\"100\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-21\",\"hum\":\"21\",\"mr\":\"16:02\",\"ms\":\"04:27\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:08\",\"ss\":\"16:53\",\"tmp_max\":\"9\",\"tmp_min\":\"-3\",\"uv_index\":\"5\",\"vis\":\"10\",\"wind_deg\":\"323\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"4\"},{\"cond_code_d\":\"100\",\"cond_code_n\":\"101\",\"cond_txt_d\":\"晴\",\"cond_txt_n\":\"多云\",\"date\":\"2018-11-22\",\"hum\":\"21\",\"mr\":\"16:36\",\"ms\":\"05:33\",\"pcpn\":\"0.0\",\"pop\":\"0\",\"pres\":\"1030\",\"sr\":\"07:09\",\"ss\":\"16:52\",\"tmp_max\":\"8\",\"tmp_min\":\"-4\",\"uv_index\":\"3\",\"vis\":\"20\",\"wind_deg\":\"35\",\"wind_dir\":\"东北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"5\"},{\"cond_code_d\":\"101\",\"cond_code_n\":\"100\",\"cond_txt_d\":\"多云\",\"cond_txt_n\":\"晴\",\"date\":\"2018-11-23\",\"hum\":\"23\",\"mr\":\"17:15\",\"ms\":\"06:41\",\"pcpn\":\"0.0\",\"pop\":\"16\",\"pres\":\"1024\",\"sr\":\"07:10\",\"ss\":\"16:52\",\"tmp_max\":\"7\",\"tmp_min\":\"-2\",\"uv_index\":\"2\",\"vis\":\"20\",\"wind_deg\":\"305\",\"wind_dir\":\"西北风\",\"wind_sc\":\"1-2\",\"wind_spd\":\"3\"}]}]}";


  5.    cJSON *root;

  6.    cJSON *results;

  7.    cJSON *basic_json, *update_json, *forecast_json;

  8.    cJSON *daily_json;


  9.    int i = 0;

  10.    char *basic_tmp, *update_tmp, *status_tmp, *weather_tmp;

  11.    root = cJSON_Parse(heweather_str);

  12.    if(root)

  13.    {

  14.        results = cJSON_GetObjectItem(root, "HeWeather6");      //HeWeather键对应的值,是一个数组

  15.        results = cJSON_GetArrayItem(results,0);

  16.        if(results)

  17.        {

  18.            basic_json = cJSON_GetObjectItem(results, "basic");

  19.            if(basic_json)

  20.            {

  21.                basic_tmp = cJSON_GetObjectItem(basic_json, "cid") -> valuestring;

  22.                printf("城市ID:%s\n",basic_tmp);

  23.                basic_tmp = cJSON_GetObjectItem(basic_json, "location") -> valuestring;

  24.                printf("县级市:%s\n",basic_tmp);

  25.                basic_tmp = cJSON_GetObjectItem(basic_json, "parent_city") -> valuestring;

  26.                printf("地级市:%s\n",basic_tmp);

  27.                basic_tmp = cJSON_GetObjectItem(basic_json, "admin_area") -> valuestring;

  28.                printf("所属省:%s\n",basic_tmp);

  29.                basic_tmp = cJSON_GetObjectItem(basic_json, "lat") -> valuestring;

  30.                printf("纬度:%s\n",basic_tmp);

  31.                basic_tmp = cJSON_GetObjectItem(basic_json, "lon") -> valuestring;

  32.                printf("经度:%s\n\n",basic_tmp);

  33.            }

  34.            update_json = cJSON_GetObjectItem(results, "update");

  35.            if(update_json)

  36.            {

  37.                update_tmp = cJSON_GetObjectItem(update_json, "loc") -> valuestring;

  38.                printf("更新时间:%s(所在地时间)\n", update_tmp);

  39.                update_tmp = cJSON_GetObjectItem(update_json, "utc") -> valuestring;

  40.                printf("更新时间:%s(世界时间)\n\n", update_tmp);

  41.            }

  42.            status_tmp = cJSON_GetObjectItem(results, "status") -> valuestring;

  43.            printf("解析状态:%s\n\n", status_tmp);

  44.            daily_json = cJSON_GetObjectItem(results, "daily_forecast");

  45.            if(daily_json)

  46.            {

  47.                for(i = 0; i < 3; i++)

  48.                {

  49.                    forecast_json = cJSON_GetArrayItem(daily_json, i);

  50.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "date") -> valuestring;

  51.                    printf("日期:%s\r\n", weather_tmp);

  52.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_d") -> valuestring;

  53.                    printf("白天天气:%s\r\n", weather_tmp);

  54.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "cond_txt_n") -> valuestring;

  55.                    printf("晚上天气:%s\r\n", weather_tmp);

  56.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_max") -> valuestring;

  57.                    printf("最高温度:%s\r\n", weather_tmp);

  58.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "tmp_min") -> valuestring;

  59.                    printf("最低温度:%s\r\n", weather_tmp);

  60.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_deg") -> valuestring;

  61.                    printf("风向角度:%s\r\n", weather_tmp);

  62.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_dir") -> valuestring;

  63.                    printf("风向:%s\r\n", weather_tmp);

  64.                    weather_tmp = cJSON_GetObjectItem(forecast_json, "wind_sc") -> valuestring;

  65.                    printf("风力:%s\r\n\n", weather_tmp);

  66.                }

  67.            }

  68.        }

  69.    }

  70.    cJSON_Delete(root);

  71.    cJSON_Delete(results);

  72.    cJSON_Delete(basic_json);

  73.    cJSON_Delete(update_json);

  74.    cJSON_Delete(forecast_json);

  75.    cJSON_Delete(daily_json);

  76. }

运行结果:

实用的API地址:

在线JSON格式校验工具:http://www.bejson.com/

免费的天气api接口:http://api.help.bj.cn/api/

后台回复“JSON”获取本工程源码下载链接(含cJSON库)

历史精选文章:

JSON简介

Jlink使用技巧之J-Scope虚拟示波器功能

BIN、HEX、AXF、ELF文件格式有什么区别

如何在Keil-MDK开发环境生成Bin格式文件


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存